package org.dj.eoms.core.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.SqlSessionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;



/**
 * 基础框架的数据访问层抽象实现类myBatis orm框架)，所有模块的数据访问层实现类均继承该类。<br>
 *
 * JDK版本：JDK1.6
 * @author CMS Team
 * @version 1.0 
 */
@Repository
public class BaseDao {
	private static final Logger log = Logger.getLogger(BaseDao.class);
	
	@Autowired
	public SqlSessionTemplate sqlSession;
	
	
	/**
	 * 获取数据库连接对象
	 * @return
	 */
	private Connection getConnection(){
		Connection connection = SqlSessionUtils.getSqlSession(
				sqlSession.getSqlSessionFactory(), sqlSession.getExecutorType(),
				sqlSession.getPersistenceExceptionTranslator()).getConnection();
		return connection;
	}
	
	
    //=================================以下代码为myBatis实现的常用方法(后缀加BySql)===========================//


    /**
     * 往库表中插入记录
     * @param statementId 调用myBatis的mapper文件的声明段名，规则名：mapper的namespace+"." + 该mapper文件某片段的id
     * @param value       要操作的对象
     * @return 插入成功的记录数
     */
    public int insertBySql(String statementId, Object value) {
        return sqlSession.insert(statementId, value);
    }

    /**
     * 删除库表中的记录（可批量删除），返回删除成功的记录数。
     *
     * @param statementId 调用myBatis的mapper文件的声明段名，规则名：mapper的namespace+"." + 该mapper文件某片段的id
     * @param value       删除条件值
     * @return 删除成功的记录数
     */
    public int deleteBySql(String statementId, Object value) {
        return sqlSession.delete(statementId, value);
    }

    /**
     * 更新库表中的记录（可批量更新），返回更新成功的记录数。
     *
     * @param statementId 调用myBatis的mapper文件的声明段名，规则名：mapper的namespace+"." + 该mapper文件某片段的id
     * @param value       更新条件值值
     * @return 更新成功的记录数
     */
    public int updateBySql(String statementId, Object value) {
        return sqlSession.update(statementId, value);
    }

    /**
     * 查询符合条件的记录，生成List返回。
     *
     * @param statementId 调用myBatis的mapper文件的声明段名，规则名：mapper的namespace+"." + 该mapper文件某片段的id
     * @param value       查询条件值
     * @return list 找到的记录
     */
    public List selectListBySql(String statementId, Object value) {
        List list = sqlSession.selectList(statementId, value);
        //log.logDebug("Execute queryForListBySql time:" + (l2 - l1) + "ms");
        //数据库含有空格的字段值(char类型)，装载到myBatis生成的持久对象属性中,是否自动去掉属性值左右两边的空格
        //如果需要去掉空格，则使用如下方式
        //list = Config.getPropertyBool("po.propertyvalue.trimable", true) ? BeanUtil.trim(list) : list
        return list;
    }


    
    /**
     * 查询单个符合条件的记录，生成Object返回</br>
     * @param statementId 调用myBatis的mapper文件的声明段名，规则名：mapper的namespace+"." + 该mapper文件某片段的id
     * @param parameter   查询条件值
     * @return list 找到的记录
     */
    public Object selectOneBySql(String statementId, Object parameter) {
        Object bean = sqlSession.selectOne(statementId, parameter);
        //log.logDebug("Execute queryForObjectBySql time:" + (l2 - l1) + "ms");
        //数据库含有空格的字段值(char类型)，装载到myBatis生成的持久对象属性中,是否自动去掉属性值左右两边的空格
        //如果需要去掉空格，则使用如下方式
        //bean = Config.getPropertyBool("po.propertyvalue.trimable", true) ? BeanUtil.trim(bean) : bean
        return bean;
    }
    
    

    
    
    /**
     * 执行sql
     * @category 该事务不在spring事务管理机制内
     * @param sql
     * @author 邓柳江
     * @return List
     * @throws SQLException
     */
    public List executeQueryBySql(String sql) throws SQLException{
    	Connection con = null;
    	Statement stmt = null;
    	
    	List list = new ArrayList();
    	try {
    		con = this.getConnection();//sqlSession.getConnection();
    		con.setAutoCommit(false);
    		stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    		ResultSet rSet = stmt.executeQuery(sql);
    		
    		
    		ResultSetMetaData md = rSet.getMetaData();
    		int num = md.getColumnCount();
    		while (rSet.next()) {
    			Map mapOfColValues = new HashMap(num);
	    		for (int i = 1; i <= num; i++) {
		    		mapOfColValues.put(md.getColumnName(i), rSet.getObject(i));
	    		}
	    		list.add(mapOfColValues);
    		}
    		
    		con.commit();
		} catch (Exception e) {
			e.printStackTrace();
			throw new SQLException("sql执行失败");
		}finally {
			if (stmt != null) {
				stmt.close();
			}
			// 此处不关闭，连接关闭由org.springframework.jdbc.datasource.DataSourceTransactionManager自动完成
			if (con != null) {
				con.close();
			}
		}
    	return list;
	}
}
